home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 2: Applications / Linux Cubed Series 2 - Applications.iso / math / yplot-0.000 / yplot-0 / yplot-0.9 / pplot.c < prev    next >
C/C++ Source or Header  |  1996-05-13  |  11KB  |  477 lines

  1. #define DOUBLE
  2. #include "yplplot.h" 
  3. #include <stdio.h> 
  4. #include <stdlib.h> 
  5.  
  6. #define WORD_CHARS "ABCDEFGHIJKLMNOPQRSTUVWXYZ_1234567890abcdefghijklmnopqrstuvwxyz"
  7. #define IWORD_CHARS "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz,;="
  8. #define NUM_CHARS "0123456789+-.EDed"
  9. /* Structure symbols in data file */
  10. #define END_WORD "="
  11. #define END_LINE ";"
  12. #define SEP_RTR ","
  13. #define COMMENT "*"
  14.  
  15. #define STYLEMAX 7
  16. #define MM 800
  17. #define mm 300
  18. #define NELS 7
  19.  
  20. PLFLT xspace[7]={0.38,0.35,0.33,0.28,0.25,0.22,0.2},
  21.        yspace[7]={0.48,0.45,0.42,0.35,0.3,0.28,0.25},
  22.        tsize[7]={0.82,0.75,0.7,0.6,0.5,0.45,0.4};
  23.  
  24. PLINT 
  25. linemark[STYLEMAX][NELS]={{MM,MM,MM,MM,MM,MM},{MM,MM,MM,MM,MM,0},{MM,MM,MM,MM,MM,MM},{MM,0,MM,0,MM,0},{mm,0,mm,0,mm,0},{MM,MM,mm,mm,0,0},{mm,mm,mm,mm,mm,mm}};
  26. PLINT
  27. linespace[STYLEMAX][NELS]={{0,0,0,0,0,0},{0,0,0,0,MM,MM},{0,MM,0,MM,0,MM},{MM,0,MM,0,MM,0},{MM,0,MM,0,MM,0},{0,MM,MM,0,MM,0},{0,0,0,0,MM,MM}};
  28.  
  29. /**********************************************************************/
  30. /* Set new line style, from own line styles                           */
  31. /* Tested OK */
  32. int lstyle(PLINT style)
  33. { if (style>0 && style <=STYLEMAX)
  34.    plstyl(NELS,linemark[style-1],linespace[style-1]);
  35. }
  36.  
  37. void limits(PLFLT xmin,PLFLT xmax,PLFLT ymin,PLFLT ymax)
  38. {
  39.  plwind(xmin,xmax,ymin,ymax);
  40. }
  41.  
  42.  
  43.  
  44. int window(PLINT xnum,PLINT ynum,PLINT currentx,PLINT currenty)
  45. { PLFLT sx,sy,cscale;
  46.   PLFLT xminp,yminp,xmaxp,ymaxp,x1s,x2s,y1s,y2s;
  47.   int maxwind;
  48.   sx = pow(xnum,-1);
  49.   sy = pow(ynum,-1); 
  50.   
  51.   xminp=(currentx-1)*sx;
  52.   xmaxp=(currentx)*sx;
  53.   yminp=(1-(currenty)*sy);
  54.   ymaxp=(1-(currenty-1)*sy);  
  55.   x1s=0.28*xspace[xnum-1];
  56.   x2s=0.07*xspace[xnum-1];
  57.   y1s=0.15*yspace[ynum-1];
  58.   y2s=0.05*yspace[ynum-1];
  59.   plvpor(xminp+x1s,xmaxp-x2s,yminp+y1s,ymaxp-y2s);
  60.   if (ynum>xnum)
  61.     maxwind=ynum;
  62.   else 
  63.    maxwind=xnum;
  64.   cscale=4.0*tsize[maxwind-1];
  65.   plschr(cscale,1);
  66.   plssym(cscale,1);
  67.  return(0);
  68. }
  69.  
  70. int sticky_window(PLINT xnum,PLINT ynum,PLINT currentx,PLINT currenty,
  71.                   double top, double right, double bot, double left)
  72. { PLFLT sx,sy,cscale;
  73.   PLFLT xminp,yminp,xmaxp,ymaxp,x1s,x2s,y1s,y2s;
  74.   int maxwind;
  75.   sx = pow(xnum,-1);
  76.   sy = pow(ynum,-1); 
  77.   
  78.   xminp=(currentx-1)*sx;
  79.   xmaxp=(currentx)*sx;
  80.   yminp=1-(currenty)*sy;
  81.   ymaxp=1-(currenty-1)*sy;  
  82.   x1s=0.28*xspace[xnum-1]*left;
  83.   x2s=0.07*xspace[xnum-1]*right;
  84.   y1s=0.15*yspace[ynum-1]*bot;
  85.   y2s=0.05*yspace[ynum-1]*top;
  86.   plvpor(xminp+x1s,xmaxp-x2s,yminp+y1s,ymaxp-y2s);
  87.   if (ynum>xnum)
  88.     maxwind=ynum;
  89.   else 
  90.    maxwind=xnum;
  91.   cscale=4.0*tsize[maxwind-1];
  92.   plschr(cscale,1);
  93.   plssym(cscale,1);
  94.  return(0);
  95. }
  96.  
  97.  
  98. int key(PLINT windx,PLINT windy,PLFLT relx,PLFLT rely,PLFLT incy,
  99.         PLINT n,char keyname[][80],PLINT ltype[])
  100. { PLINT tel;
  101.  
  102.   limits(0,1,1,0);
  103.   plschr(0,0.9);
  104.   for (tel=0;tel<n;tel++)
  105.     { lstyle(ltype[tel]);
  106.       plcol(ltype[tel]);
  107.       plwid(3);
  108.       pljoin(relx,rely+(tel*incy),relx+0.15,rely+(tel*incy));
  109.       plcol(15);
  110.       plwid(2);
  111.       plptex(relx+0.17,rely+(tel*incy),0,0,0,keyname[tel]);
  112.     }
  113.   plschr(0,1);
  114. }
  115.  
  116. int charkey(PLINT windx,PLINT windy,PLFLT relx,PLFLT rely,PLFLT incy,
  117.         PLINT n,char keyname[][80])
  118. { PLINT tel;
  119.  
  120.   limits(0,1,1,0);
  121.   plcol(15);
  122.   plschr(0,0.9);
  123.   for (tel=0;tel<n;tel++)
  124.       plptex(relx,rely+(tel*incy),0,0,0,keyname[tel]);
  125.   plschr(0,1);
  126. }
  127.  
  128.  
  129. int plsetfile(char fname[])
  130. { FILE *fle;
  131.   
  132.   fle=fopen(fname,"w");
  133.   if (fle==NULL) return(0);
  134.   else 
  135.    { plsfile(fle);
  136.      return(1);
  137.    }
  138. }
  139.  
  140.     
  141. void plogxline(int n,double *x,double *y)
  142. { int i,count;
  143.   double *a,*b;
  144.   
  145.   a=(double*)malloc(n*sizeof(double));
  146.   b=(double*)malloc(n*sizeof(double));  
  147.   count=0;
  148.   for (i=0;i<n;i++)
  149.    { if (x[i]>0)
  150.       { a[count]=log10(x[i]);
  151.         b[count]=y[i];
  152.         count++;
  153.       }
  154.    }
  155.    plline(count,a,b);
  156. }
  157.  
  158. void plogyline(int n,double *x,double *y)
  159. { int i,count;
  160.   double *a,*b;
  161.   
  162.   a=(double*)malloc(n*sizeof(double));
  163.   b=(double*)malloc(n*sizeof(double));  
  164.   count=0;
  165.   for (i=0;i<n;i++)
  166.    { if (y[i]>0)
  167.       { a[count]=x[i];
  168.         b[count]=log10(y[i]);
  169.         count++;
  170.       }
  171.    }
  172.    plline(count,a,b);
  173. }
  174.  
  175. void plogxyline(int n,double *x,double *y)
  176. { int i,count;
  177.   double *a,*b;
  178.   
  179.   a=(double*)malloc(n*sizeof(double));
  180.   b=(double*)malloc(n*sizeof(double));  
  181.   count=0;
  182.   for (i=0;i<n;i++)
  183.    { if (y[i]>0 && x[i]>0)
  184.       { a[count]=log10(x[i]);
  185.         b[count]=log10(y[i]);
  186.         count++;
  187.       }
  188.    }
  189.    plline(count,a,b);
  190. }
  191.  
  192. int logfilter(int n,double *x,double *y,double *a,double *b)
  193. { int i,count;
  194.   count=0;
  195.   for (i=0;i<n;i++)
  196.    { if (y[i]>0 && x[i]>0)
  197.       { a[count]=x[i];
  198.         b[count]=y[i];
  199.         count++;
  200.       }
  201.    }
  202.   return(count);
  203. }
  204.  
  205.  
  206. void pltest(double *line,int x, int y)
  207. { int j,k;
  208.   double **pt;
  209.   printf("x=%d y=%d\n",x,y);
  210.   for (k=0;k<x*y;k++)
  211.     printf("%2.3f ",line[k]);
  212.   printf("\n");
  213.   pt=(double **)malloc(y*sizeof(double *));
  214.    for (j=0; j<y; j++)
  215.      pt[j]=(line+j*x);
  216.   
  217.   for (j=0;j<y;j++)
  218.    { for (k=0;k<x;k++)
  219.       printf("%2.3f ",pt[j][k]);
  220.      printf("\n");
  221.    }
  222. }
  223.  
  224.  
  225. double **make2d(double *line,int x, int y)
  226. { int j,k;
  227.   double *myline,**pt;
  228.  
  229.   pt=(double **)malloc(x*sizeof(double *));
  230.   myline=(double *)malloc(x*y*sizeof(double));
  231.    for (j=0; j<x; j++)
  232.      pt[j]=(myline+j*y);
  233.    for (j=0; j<x; j++)
  234.     for (k=0; k<y; k++)
  235.      { pt[j][k]=line[j+k*x];
  236.  /*      printf("%2.1f ",pt[j][k]);*/
  237.      }
  238.   return(pt);
  239. }
  240.  
  241. double **TwoD_init(int x,int y)
  242. { int ct;
  243.   double **pt,*bpt;
  244.   pt=(double **)malloc(x*sizeof(double *));
  245.   bpt=(double *)malloc(x * y * sizeof(double));
  246.    for (ct=0; ct<x; ct++)
  247.      pt[ct]=(bpt+ct*y);
  248.   return(pt);
  249. }
  250.  
  251.  
  252. void pplcont2d(double *z0,int nx,int ny,double *clevel, int nlevel,
  253.               double *x0,double *y0)
  254. { double **z,**c_x,**c_y;
  255.   PLcGrid2 cgrid1;
  256.   
  257.   z=make2d(z0,nx,ny);  
  258.   c_x=make2d(x0,nx,ny);
  259.   c_y=make2d(y0,nx,ny);
  260.      cgrid1.xg = c_x;
  261.      cgrid1.yg = c_y;
  262.      cgrid1.nx = nx;
  263.      cgrid1.ny = ny;
  264.   plcont(z,nx,ny,1,nx,1,ny,clevel,nlevel,pltr2,(void *) &cgrid1);                 
  265. }
  266.  
  267. void pplcont1(double *z0,int nx,int ny,double *clevel, int nlevel)
  268. { double **z,*x,*y;
  269.   int i;
  270.   PLcGrid cgrid1;
  271.   z=make2d(z0,nx,ny);
  272.   x=(double *)malloc(nx*sizeof(double));
  273.   y=(double *)malloc(ny*sizeof(double));
  274.   for (i=0;i<nx;i++)
  275.      x[i]=i+1;
  276.   for (i=0;i<ny;i++)
  277.      y[i]=i+1;
  278.      cgrid1.xg = x;
  279.      cgrid1.yg = y;
  280.      cgrid1.nx = nx;
  281.      cgrid1.ny = ny;
  282.   plcont(z,nx,ny,1,nx,1,ny,clevel,nlevel,pltr1,(void*) &cgrid1);
  283.   
  284. }
  285.  
  286. void pplshade0(double *z0,int nx,int ny,double *clevel, int nlevel,
  287.                double zmin, double zmax,double *x0,double *y0)
  288. { double **z,**c_x,**c_y;
  289.   int i;
  290.   PLcGrid2 cgrid1;
  291.   double shade_min, shade_max, sh_color;
  292.   int sh_cmap = 0, sh_width, min_color = 1, min_width = 1, max_color = 70, 
  293.       max_width = 1;
  294.  
  295.    z=make2d(z0,nx,ny);
  296.    c_x=make2d(x0,nx,ny);
  297.    c_y=make2d(y0,nx,ny);
  298.      cgrid1.xg = c_x;
  299.      cgrid1.yg = c_y;
  300.      cgrid1.nx = nx;
  301.      cgrid1.ny = ny;
  302.      
  303.     for (i = 0; i < nlevel; i++) {
  304.     shade_min = zmin + (zmax - zmin) * i / (double) nlevel;
  305.     shade_max = zmin + (zmax - zmin) * (i +1) / (double) nlevel;
  306.     sh_color = floor(i / (double) (nlevel)*max_color);
  307.      printf("sh_color=%2.3f\n",sh_color);
  308.      sh_width = 1;
  309.     plpsty(0);
  310.  
  311.     plshade(z, nx, ny, NULL, 1, (double)nx, 1, (double)ny, 
  312.         shade_min, shade_max, 
  313.         sh_cmap, sh_color, sh_width,
  314.         min_color, min_width, max_color, max_width,
  315.         plfill, 0, pltr1, (void *) &cgrid1);
  316.     }
  317.   
  318. }
  319.  
  320. void pplshade1(double *z0,int nx,int ny,double *clevel, int nlevel,
  321.                double zmin, double zmax)
  322. { double **z,*x,*y;
  323.   int i;
  324.   PLcGrid cgrid1;
  325.   double shade_min, shade_max, sh_color;
  326.   int sh_cmap = 1, sh_width, min_color = 1, min_width = 1, max_color = 70, 
  327.       max_width = 1;
  328.  
  329.   z=make2d(z0,nx,ny);
  330.   x=(double *)malloc(nx*sizeof(double));
  331.   y=(double *)malloc(ny*sizeof(double));
  332.   for (i=0;i<nx;i++)
  333.      x[i]=i+1;
  334.   for (i=0;i<ny;i++)
  335.      y[i]=i+1;
  336.      cgrid1.xg = x;
  337.      cgrid1.yg = y;
  338.      cgrid1.nx = nx;
  339.      cgrid1.ny = ny;
  340.      
  341.     for (i = 0; i < nlevel; i++) {
  342.     shade_min = zmin + (zmax - zmin) * i / (double) nlevel;
  343.     shade_max = zmin + (zmax - zmin) * (i +1) / (double) nlevel;
  344.     sh_color = i / (double) (max_color);
  345.     printf("sh_color=%2.3f\n",sh_color);
  346.     sh_width = 1;
  347.     plpsty(0);
  348.  
  349.     plshade(z, nx, ny, NULL, 1, nx, 1, ny, 
  350.         shade_min, shade_max, 
  351.         sh_cmap, sh_color, sh_width,
  352.         min_color, min_width, max_color, max_width,
  353.         plfill, 0, pltr1, (void *) &cgrid1);
  354.         printf("shade %d completed",i);
  355.     }
  356.   
  357. }
  358.  
  359. void my_plot3d(double *x,double *y,double *z, int nx, int ny, int opt, int side)
  360. { double **c_z;
  361.  
  362.   c_z=make2d(z,nx,ny);
  363.   plot3d(x,y,c_z,nx,ny,opt,side);
  364. }
  365.  
  366. void my_plmesh(double *x,double *y,double *z, int nx, int ny, int opt)
  367. { double **c_z;
  368.  
  369.   c_z=make2d(z,nx,ny);
  370.   plmesh(x,y,c_z,nx,ny,opt);
  371. }
  372.  
  373. int my_read_matrix(char fname[],int line1,int line2,
  374.                int xcol,double *x0,int xnum)
  375. { double **x;
  376.   int i,j,num;
  377.   
  378.   x=TwoD_init(line2-line1+1,xnum);
  379.   num=read_matrix(fname,line1,line2,xcol,x,xnum);
  380.   for (j=0;j<=(line2-line1);j++)
  381.     for (i=0;i<xnum;i++)
  382.       x0[j*xnum+i]=x[j][i];
  383.   return(num);
  384. }
  385.  
  386. void my_plbox(char *xopt,double xtick,int nxsub,char *yopt,double ytick,int nysub)
  387. { int xsub,ysub;
  388.   
  389.   xsub=(int)nxsub;
  390.   ysub=(int)nysub;
  391.   plbox(xopt,xtick,xsub,yopt,ytick,ysub);
  392. }
  393.  
  394. void pvfield(int vnum,double *x1,double *y1, double *x2,double *y2,
  395.              double size,char point[])
  396. {int i;
  397.  double xa,xb,ya,yb,l=3,xp1,xp2,yp1,yp2,th,norm;
  398.  for (i=0; i<vnum;i++)
  399.    { xa=x1[i];
  400.      xb=x1[i]+x2[i];
  401.      ya=y1[i];
  402.      yb=y1[i]+y2[i];
  403.      pljoin(xa,ya,xb,yb);
  404.      norm=sqrt(pow(x2[i],2)+pow(y2[i],2));
  405.      if (xa!=xb)
  406.       th=atan((yb-ya)/(xb-xa));
  407.        
  408.      else
  409.       { if (yb>=ya)
  410.          th=PI/2;
  411.         else
  412.          th=-PI/2;
  413.       }
  414.      if (xb>=xa) 
  415.       { xp1=xb+size*norm*cos(PI+th-0.5236);
  416.         yp1=yb+size*norm*sin(PI+th-0.5236);
  417.         xp2=xb+size*norm*cos(PI+th+0.5236);  
  418.         yp2=yb+size*norm*sin(PI+th+0.5236);
  419.       }
  420.      else
  421.       { xp1=xb-size*norm*cos(PI+th-0.5236);
  422.         yp1=yb-size*norm*sin(PI+th-0.5236);
  423.         xp2=xb-size*norm*cos(PI+th+0.5236);  
  424.         yp2=yb-size*norm*sin(PI+th+0.5236);
  425.       }
  426.      pljoin(xb,yb,xp1,yp1);
  427.      pljoin(xb,yb,xp2,yp2);
  428.      plptex(xa,ya,0,0,0.5,point);
  429.    }
  430. }
  431.  
  432. void pvfield1(int nx,int ny,double *x2,double *y2,
  433.              double size,char point[])
  434. {int i,vnum,j;
  435.  double xa,xb,ya,yb,l=3,xp1,xp2,yp1,yp2,th,norm,*x1,*y1;
  436.  
  437.  vnum=nx*ny; 
  438.  x1=(double *)malloc(vnum*sizeof(double));
  439.  y1=(double *)malloc(vnum*sizeof(double));
  440.   for (i=0;i<nx;i++)
  441.     for (j=0;j<ny;j++)
  442.       { y1[i*nx+j]=j+1;
  443.         x1[i*nx+j]=i+1;
  444.       }
  445.  for (i=0; i<vnum;i++)
  446.    { xa=x1[i];
  447.      xb=x1[i]+x2[i];
  448.      ya=y1[i];
  449.      yb=y1[i]+y2[i];
  450.      pljoin(xa,ya,xb,yb);
  451.      norm=sqrt(pow(x2[i],2)+pow(y2[i],2));
  452.      if (xa!=xb)
  453.       th=atan((yb-ya)/(xb-xa));
  454.        
  455.      else
  456.       { if (yb>=ya)
  457.          th=PI/2;
  458.         else
  459.          th=-PI/2;
  460.       }
  461.      if (xb>=xa) 
  462.       { xp1=xb+size*norm*cos(PI+th-0.5236);
  463.         yp1=yb+size*norm*sin(PI+th-0.5236);
  464.         xp2=xb+size*norm*cos(PI+th+0.5236);  
  465.         yp2=yb+size*norm*sin(PI+th+0.5236);
  466.       }
  467.      else
  468.       { xp1=xb-size*norm*cos(PI+th-0.5236);
  469.         yp1=yb-size*norm*sin(PI+th-0.5236);
  470.         xp2=xb-size*norm*cos(PI+th+0.5236);  
  471.         yp2=yb-size*norm*sin(PI+th+0.5236);
  472.       }
  473.      pljoin(xb,yb,xp1,yp1);
  474.      pljoin(xb,yb,xp2,yp2);
  475.      plptex(xa,ya,0,0,0.5,point);
  476.    }
  477. }